//! # Mapper - 映射器配置模块
//! 
//! 映射器配置模块用于保存映射器的配置信息。
//! 
//! 主要由 [`MapperConfig`] 结构体进行保存。

use mp4game::mapper::{CreateMapperError, MidiMapper};
use serde::{Deserialize, Serialize};
use serde_json::Value;

/// 映射器配置
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
pub struct MapperConfig {
    /// 映射器名称
    #[serde(default = "mapper_default_name")]
    pub name: String,

    /// 映射规则
    #[serde(default = "mapper_default_rule")]
    pub rule: Value,
}

/// 默认映射器名称
fn mapper_default_name() -> String {
    "DefaultMapper".to_owned()
}

/// 默认映射器规则
fn mapper_default_rule() -> Value {
    Value::Null
}

impl MapperConfig {
    /// 创建映射器
    pub fn create_mapper(&self) -> Result<Box<dyn MidiMapper>, CreateMapperError> {
        mp4game::mapper::create_mapper(&self.name, self.rule.clone())
    }
}
